package com.shrio.test.entity;

import com.shrio.test.service.UserService;
import org.apache.shiro.authc.*;
import org.apache.shiro.authz.AuthorizationInfo;
import org.apache.shiro.authz.SimpleAuthorizationInfo;
import org.apache.shiro.crypto.hash.SimpleHash;
import org.apache.shiro.realm.AuthenticatingRealm;
import org.apache.shiro.realm.AuthorizingRealm;
import org.apache.shiro.subject.PrincipalCollection;
import org.apache.shiro.util.ByteSource;
import org.springframework.beans.factory.annotation.Autowired;

/**
 * Created by joychen on 2018/2/25.
 */
public class ShiroRealm extends AuthorizingRealm {

    @Autowired
    UserService userService;

    /**
     * 1.doGetAuthenticationInfo  获取认证消息如果没有数据，返回null.如果得到正确的用户名和密码,返回下类型 的对象
     * 2.AuthenticationInfo 可以使用SimpleAuthenticationInfo实现类，封装你正确的用户名和密码
     * <p>
     * 3. token 就是从前端传过来的,之前是UserNamePasswordToken传过来的。通过它去验证
     *
     * @param token
     * @return
     * @throws AuthenticationException
     */
    protected AuthenticationInfo doGetAuthenticationInfo(AuthenticationToken token) throws AuthenticationException {

        SimpleAuthenticationInfo info = null;   //先声明这个对象
        //1.转换token
        UsernamePasswordToken upToken = (UsernamePasswordToken) token;
        //2.获取用户就可以
        String username = upToken.getUsername();
//        //3.查询数据库，是否存在指定用户名和密码的用户
        UserEntity user = userService.findUser(username);

        System.out.println("user"+user+"    --");

        if (user != null) {
            String realmName = this.getName();
//            这里是如果数据库没有加密存储需要自己从数据库中找出来后通过SimpleHash 来转一下。
            //盐值  ByteSource
            ByteSource salt = ByteSource.Util.bytes(user.getUname());

            SimpleHash sh = new SimpleHash("MD5",user.getPassword(),salt,1024);
//            info = new SimpleAuthenticationInfo(user.getUname(), sh, realmName);
//            info = new SimpleAuthenticationInfo(user.getUname(), user.getPassword(), realmName);   //这句话会自动和传入的 用户名和密码进行验证
              info = new SimpleAuthenticationInfo(user.getUname(), sh,salt, realmName);
        } else {
            throw new UnknownAccountException();
        }
        //4.如果查询到了，封装查询结束，返回给我们的调用
        //5.如果没有查询到，抛出异常
        return info;
    }

    protected AuthorizationInfo doGetAuthorizationInfo(PrincipalCollection principalCollection) {
//    返回值 ： AuthorizatioInfo,封装获取的用户对应的所有角色，    SimpleAuthorizationInfo(Set<String>)


        //2.获取用户就可以
        String username = principalCollection.toString();
//        //3.查询数据库，是否存在指定用户名和密码的用户
        UserEntity user = userService.findUser(username);

        if (user != null) {

        }

        System.out.println("user"+user+"    --");


//    参数列表：PrincipalCollection    登录的身份，登录的用户名


        return null;
    }
}
